const db = require('../db/index')
const bcrypt = require("bcrypt");
const jwt = require('jsonwebtoken')
const jwtConfig = require('../config/JwtConfig')

const register = (req, res) => {
    let {account, password} = req.body
    // 1. 非空和有效性校验
    if (!account || !password) {
        return res.send({
            code: 1,
            message: '账号或者密码为空'
        })
    }
    // 2. 账号是否已经存在
    // 参数： 执行语句 参数 回调函数处理结果
    db.query('select * from users where account = ?', account, (err, results) => {
        if (results.length > 0) {
            return res.send({
                code: 1,
                message: '账号已存在'
            });
        }
        // 3. 对注册的密码进行加密 参数：需要加密的值 盐值波动范围
        password = bcrypt.hashSync(password, 10)
        // 4. 将账号和密码插入users表
        db.query('insert into users set ?', {
            account,
            password,
            identity: '用户',
            create_time: new Date(),
            status: 0
        }, (err, results) => {
            if (results.affectedRows !== 1) {
                //affectedRows 影响行数不唯一(没有影响到行数) 即插入失败
                return res.send({
                    code: 1,
                    message: '账号注册失败'
                })
            }
            res.send({
                code: 0,
                message: '账号注册成功'
            })
        })
    })


}
const login = (req, res) => {
    const {account, password} = req.body
    // 查看数据库有无前端传过来的账号
    db.query('select * from users where account = ?', account, (err, results) => {
        // 一般会在数据库断开是执行失败
        if (err) return res.cc(err)
        if (results.length !== 1) return res.cc('未查询到数据，登录失败')
        // 对前端传过来的密码进行对比校验
        const compareResult = bcrypt.compareSync(password, results[0].password)
        if (!compareResult) {
            return res.cc('密码错误，登录失败')
        }
        // 对账号是否冻结做判定
        if (results[0].status === 1) {
            return res.cc('账号已被冻结')
        }
        // 返回token 给前端
        const user = {
            ...results[0],
            password: '',
            imageUrl: '',
            create_time: '',
            update_time: ''
        }
        //生成token 设置有效时长为 6 个小时
        const tokenStr = jwt.sign(user, jwtConfig.jwtSecretKey, {
            expiresIn: '6h'
        })
        res.send({
            results: results[0],
            code: 0,
            message: '登录成功',
            token: 'Bearer ' + tokenStr
        })
    })
}
module.exports = {
    register,
    login
}